在跑training時,每次的epoch都會秀出每次訓練和測試的loss以及accuracy,我們可以將它畫成圖:
我們可以看到大約在epoch大於5後,測試的accuracy以呈現水平沒有提升,反而測試的loss還有些微上升的趨向,這表示訓練資料已經訓練到飽和了,以學術名稱叫做"overfitting”。
我們將convolution的數量調高,並且增加一組(以我的電腦來說,這訓練時間約變為2倍QQ):
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
可以看到結果是接近的,同樣測試的accuracy已達水平且測試的loss還有些微上升的趨向,只有飽和情況略為延後約2個epoch:
這時我們可以利用ImageDataGenerator 的功能,將原本的圖庫轉一轉(rotation_range),調整大小(width_shift_range, height_shift_range),扭轉(shear_range),放大縮小(zoom_range),翻轉(horizontal_flip),而這在實際作用的解釋可以理解為,例如在旋轉和扭轉,能辨識出不同的姿勢或角度,調整大小和縮放則可以處理不同的體態等:
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
比較結果如下,不論是訓練還是測試,accuracy都還在上升,loss也還在下降,且測試的loss已經降至比之前的結果還低: